package com.example.tliasmanagement.aop;

import com.example.tliasmanagement.dto.LoginDto;
import com.example.tliasmanagement.entity.EmpLoginLog;
import com.example.tliasmanagement.mapper.OperateLogMapper;
import com.example.tliasmanagement.util.JwtUtils;
import com.example.tliasmanagement.util.UserThreadLocal;
import com.example.tliasmanagement.vo.LoginResultVo;
import com.example.tliasmanagement.vo.Result2;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;

@Slf4j
@Component
@Aspect
public class LoginAspect {
    /*@Autowired
    private HttpServletRequest request;*/
    @Autowired
    private OperateLogMapper logMapper;
/*
    *   - 用户名 （登录时，输入的用户名）  ----- 【提示：用户名在原始方法执行时的参数中  -- 可以强转】
      - 密码 （登录时，输入的密码）     -------- 【提示：密码在原始方法执行时的参数中 】
      - 操作时间 （什么时间，员工登录的）
      - 登录是否成功    ------ 【提示：在原始方法执行后的返回值中，可以通过Result来获取code从而判断成功还是失败 -- 可以强转】
      - 登录成功后，下发的jwt令牌   ------ 【提示：jwt在原始方法执行后的返回值中  -- 可以强转】
      - 登录操作耗时*/

    @Around("@annotation(myLog)")
    public Object around(ProceedingJoinPoint joinPoint, MyLog1 myLog) throws Throwable {
        log.info(" LogAspect---------------------------------");
        //开始时间
        long startTime = System.currentTimeMillis();
        //用户名和密码
        Object[] args = joinPoint.getArgs();
        String username = null;
        String password = null;
        for (Object arg : args) {
            username = ((LoginDto) arg).getUsername();
            password = ((LoginDto) arg).getPassword();
        }
        Integer code;
        String token;
        Object proceed = null;
        try {
            proceed = joinPoint.proceed();
        } finally {
            //返回值
            Result2 returns = (Result2) proceed;
            if (returns != null) {
                code = returns.getCode();   //返回值状态
                //token
                LoginResultVo data = (LoginResultVo) returns.getData();
                token = data.getToken();
            } else {
                code = null;
                token = null;
            }
            //结束时间
            long endTime = System.currentTimeMillis();
            long costTime = endTime - startTime;

            EmpLoginLog log = EmpLoginLog.builder()
                    .username(username)
                    .password(password)
                    .loginTime(LocalDateTime.now())
                    .isSuccess((short) (code == null ? 0 : code))
                    .jwt(token)
                    .costTime(costTime).build();
            logMapper.insert(log);
        }
        return proceed;
    }
}
